package com.ruoyi.web.controller.iot;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.exception.file.InvalidExtensionException;
import com.ruoyi.common.utils.file.FileTypeUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.IotShowTemplate;
import com.ruoyi.system.domain.IotShowTemplateUpload;
import com.ruoyi.system.service.IotShowTemplateService;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.List;

@RestController
@RequestMapping("/iot/showTemplate")
public class IotShowTemplateController extends BaseController {

    @Autowired
    private IotShowTemplateService iotShowTemplateService;

    @GetMapping(value = "/getTemplate")
    public AjaxResult getTemplate() {
        return success(iotShowTemplateService.getTemplate());
    }

    /**
     * 查询显示模板列表
     */
    @GetMapping("/list")
    public TableDataInfo list(IotShowTemplate iotShowTemplate) {
        startPage();
        List<IotShowTemplate> list = iotShowTemplateService.selectIotShowTemplateList(iotShowTemplate);
        return getDataTable(list);
    }

    /**
     * 删除显示模板
     */
    @DeleteMapping("/{ids}")
    public AjaxResult remove(@PathVariable Long[] ids) {
        return toAjax(iotShowTemplateService.deleteIotShowTemplateByIds(ids));
    }

    @PostMapping("/uploadAndParse")
    @ResponseBody
    public AjaxResult uploadAndParseFile(@RequestParam("file") MultipartFile file) throws IOException, InvalidExtensionException {
        // 1. 文件校验
        // 校验文件大小、扩展名等:cite[1]:cite[3]:cite[5]
        String[] allowedExtensions = {"txt", "json"}; // 允许的文件扩展名
        FileUploadUtils.assertAllowed(file, allowedExtensions); // 参考若依的校验方法

        // 2. 可选：保存文件到服务器:cite[1]:cite[3]
        // String filePath = RuoYiConfig.getUploadPath();
        // String fileName = FileUploadUtils.upload(filePath, file);

        // 3. 解析文件内容
        String originalFilename = file.getOriginalFilename();
        String fileType = FileTypeUtils.getFileType(originalFilename); // 获取文件类型，若依工具类

        try {
            if ("txt".equalsIgnoreCase(fileType)) {
                return parseTxtFile(file);
            } else if ("json".equalsIgnoreCase(fileType)) {
                return parseJsonFile(file);
            } else {
                return AjaxResult.error("不支持的文件类型");
            }
        } catch (Exception e) {
            return AjaxResult.error("解析文件失败: " + e.getMessage());
        }
    }

    private AjaxResult parseTxtFile(MultipartFile file) throws IOException {
        // 方法1: 直接读取为字符串
        String content = new String(file.getBytes(), StandardCharsets.UTF_8); // 注意编码

        // 方法2: 使用 BufferedReader 按行读取
        StringBuilder contentBuilder = new StringBuilder();
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(file.getInputStream()))) {
            String line;
            while ((line = reader.readLine()) != null) {
                contentBuilder.append(line).append("\n");
                // 这里可以按行处理逻辑
            }
        }
        String parsedContent = contentBuilder.toString(); // 或使用 content
        // 接下来可以根据你的业务逻辑处理 parsedContent
        // 例如，按特定分隔符拆分，或者进行正则匹配等。

        // 返回解析结果
        return AjaxResult.success("TXT文件解析成功", parsedContent); // 将解析内容返回给前端，或保存到数据库等
    }

    private AjaxResult parseJsonFile(MultipartFile file) throws IOException {
        // 读取文件内容为字符串
        String jsonString = new String(file.getBytes(), StandardCharsets.UTF_8);

        ObjectMapper objectMapper = new ObjectMapper();

        try {
            // 方式1: 解析为通用的 JsonNode（适用于结构不固定或需要遍历的JSON）
//            JsonNode jsonNode = objectMapper.readTree(jsonString);
            // 可以对 jsonNode 进行操作，例如 get("key").asText()

            // 方式2: 解析为特定的 Java 对象（推荐，如果JSON结构稳定）
            IotShowTemplateUpload dataModel = objectMapper.readValue(jsonString, IotShowTemplateUpload.class);
            // 其中 YourDataModel 是你定义的与JSON结构对应的POJO类
            iotShowTemplateService.saveShowTemplate(dataModel);
            // 示例：假设JSON是简单的键值对，返回解析后的对象
            // 这里直接返回JsonNode给前端，实际业务中可能需要进一步处理或持久化
            return AjaxResult.success("JSON文件解析成功", dataModel);

        } catch (JsonProcessingException e) {
            // JSON格式错误
            return AjaxResult.error("JSON格式错误: " + e.getMessage());
        } catch (Exception e) {
            return AjaxResult.error("解析JSON失败: " + e.getMessage());
        }
    }

    @PostMapping("/export")
    public void export(HttpServletResponse response) throws IOException {
        response.setContentType("application/x-www-form-urlencoded");
        response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode("组态模板.json", "UTF-8"));
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("export/组态模板.json");
        try (
                OutputStream out = response.getOutputStream()) {
            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                out.write(buffer, 0, bytesRead);
            }
            out.flush();
        }
    }

}
